#include <iostream>
#include <pthread.h>
#include <unistd.h>
#include <ctime>
#include <cstring>
#include <cstdlib>
#include "threadpool.hpp"
#include "Task.hpp"
const char rules[] = "+-*/%";
void Push_Task(ThreadPool<Task<int>> &threads)
{
    // int count = 9;
    while (true)
    {
        sleep(1);
        int data1 = rand() % 10;
        int data2 = rand() % 10;
        char rule = rules[rand() % strlen(rules)];
        Task<int> task{data1, data2, rule};
        threads.Push(task);
    }
}
int main()
{
    srand(time(nullptr) ^ pthread_self()); // 目的仅是让种子更随机一点
    // 定义一个线程池
    ThreadPool<Task<int>> threads;
    // 让新线程开始运行
    threads.Start_Task();

    // 主线程派发任务
    Push_Task(threads);

    // 主线程回收新线程
    threads.Join_Threads();
    return 0;
}

// long long function(int arg)
// {
//     while(arg)
//     {
//         std::cout << arg-- << std::endl;
//         sleep(1);
//     }
//     return 10000;
// }
// int main()
// {
//     Thread<long long, int> thread1(function, 3);
//     std::cout << thread1.thread_name() << "is running" << std::endl;
//     thread1.Start();
//     thread1.Join();

//     Thread<long long, int> thread2(function, 5);
//     std::cout << thread2.thread_name() << "is running" << std::endl;
//     thread2.Start();
//     thread2.Join();
//     return 0;
// }
// #include <unistd.h>
// #include "threadpool.hpp"

// int main()
// {
//     ThreadPool<int> thread_pool;
//     thread_pool.Start();
//     int i = 0;
//     while(true)
//     {
//         sleep(5);
//         thread_pool.Push(i++);
//     }
//     thread_pool.Join();
//     return 0;
// }
// #include <iostream>
// #include <unistd.h>
// #include <ctime>
// #include <cstdlib>
// #include <cstring>
// #include "ProtectResourse.hpp"
// #include "threadpool.hpp"
// #include "RingBuffer.hpp"
// #include "Task.hpp"
// //生产者方法
// const char str[] = "+-*/%!@";
// void* Productor(void* arg)
// {
//     Productor_C<Task<int>>* PD  = static_cast<Productor_C<Task<int>>*>(arg);
//     std::string name = PD->GetName();
//     while(true)
//     {
//         //生产数据
//         int data1 = rand() % 10;
//         int data2 = rand() % 10;
//         char oper = str[rand() % strlen(str)];
//         Task<int> task{data1, data2, oper};

//         //插入
//         PD->_RB->Push(task);

//         //打印日志
//         std::cout << name << " : ";
//         task.TaskPrint();

//     }
// }

// //消费者方法
// void* Consumer(void* arg)
// {
//     Consumer_C<Task<int>>* CS = static_cast<Consumer_C<Task<int>>*>(arg);
//     std::string name = CS->GetName();
//     while(true)
//     {
//         //拿数据
//         Task<int> task;
//         CS->_RB->Pop(&task);

//         //处理数据
//         task.Run();

//         //打印日志
//         std::cout << name << " : ";
//         task.ResultPrint();
//         sleep(1);
//     }

// }
// int main()
// {
//     srand(time(nullptr) ^ pthread_self());
//     //创建两个生产者
//     threadpool procductors(2);
//     //创建三个消费者
//     threadpool consumers(3);
//     //定义一份shared resourse 环形队列
//     RingBuffer<Task<int>>* RB = new RingBuffer<Task<int>>;
//     Productor_C<Task<int>> PD(RB);
//     Consumer_C<Task<int>> CS(RB);
//     //让新线程执行对应方法
//     procductors.Create(Productor, &PD);
//     consumers.Create(Consumer, &CS);
//     //等待新线程
//     procductors.Join();
//     consumers.Join();
//     return 0;
// }